package com.station.Activitys.activity;

import android.Manifest;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx;
import com.maning.updatelibrary.InstallUtils;
import com.station.Activitys.R;
import com.station.Activitys.activity.base.BaseActivity;
import com.station.Activitys.adapter.FragmentAdapter;
import com.station.Activitys.bean.AppUpdate;
import com.station.Activitys.bean.Linkage;
import com.station.Activitys.bean.Spinner;
import com.station.Activitys.fragment.HomeFragment;
import com.station.Activitys.fragment.MyFragment;
import com.station.Activitys.fragment.NewsFragment;
import com.station.Activitys.fragment.TestWorkFragment;
import com.station.Activitys.fragment.WorkFragment;
import com.station.Activitys.http.manager.HomeManager;
import com.station.Activitys.utils.CacheManger;
import com.station.Activitys.utils.Constant;
import com.station.Activitys.utils.FileUtils;
import com.station.Activitys.utils.LogUtils;
import com.station.Activitys.utils.StringUtils;
import com.station.Activitys.utils.ToastUtils;
import com.tbruyelle.rxpermissions2.Permission;
import com.tbruyelle.rxpermissions2.RxPermissions;

import org.simple.eventbus.Subscriber;

import java.util.ArrayList;
import java.util.List;

import io.reactivex.functions.Consumer;
import q.rorbin.badgeview.Badge;
import q.rorbin.badgeview.QBadgeView;

/**
 * 项目名称：基站管理平台 手机app
 * 类描述：项目主页面
 * 创建人：张飞祥
 * 创建时间：2018/8/27 13:42
 * 修改人：张飞祥
 * 修改时间：2018/8/27 13:42
 * 修改备注：
 */
public class MainActivity extends BaseActivity implements ViewPager.OnPageChangeListener {

    //切换视图
    ViewPager vpMain;
    //底部导航栏
    BottomNavigationViewEx navigationMain;

    //创建 Gson 解析 实体类
    public static Gson mGson = new Gson();
    //fragment 集合
    private List<Fragment> fragments = new ArrayList<>();
    //fragment 适配器
    private FragmentAdapter fragmentAdapter;

    //初始化网络请求
    public HomeManager mApiManager;
    //更新内容
    private String content = "";

    @Override
    protected void initUI() {
        setContentView(R.layout.act_main);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getHomeApiManager(this,this.getTaskId());
        //获取 用户 id
        mUser = CacheManger.getUser(mACache);
        //切换视图
        vpMain = findViewById(R.id.vp_main);
        //底部导航栏
        navigationMain = findViewById(R.id.navigation_main);

        //APP检查更新 网络请求
        mApiManager.inspectUpdateApp(Constant.APP_TYPE);
        //获取 三级联动数据
        mApiManager.appGetLinkage();
        //获取所有集合
        mApiManager.appAllSelect();
    }

    @Override
    protected void initData() {
        //TODO 禁止所有导航栏特效
        navigationMain.enableAnimation(false);
        navigationMain.enableShiftingMode(false);
        navigationMain.enableItemShiftingMode(false);

        //adapter 加载 fragment 具体 操作
        initAddFragmentToViewPager();
        //TODO 配置相应的权限
        requestPermissions();
    }

    /**
     * 初始化 适配器数据
     */
    private void initAddFragmentToViewPager() {

        //添加 Fragment
        fragments.add(new HomeFragment());          //首页
        fragments.add(new NewsFragment());          //信息中心

        //获取当前用户身份
        String type = mUser.getDepartmentType();
        if (type.equals(Constant.USER_UI))
            //添加显示设计院 工单
            fragments.add(new WorkFragment());
        else
            //添加显示代维公司 工单
            fragments.add(new TestWorkFragment());

        fragments.add(new MyFragment());            //我的
        //fragment 适配器
        fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), fragments);
        // 配置适配器
        vpMain.setAdapter(fragmentAdapter);
        //设置导航栏与 viewPager 绑定
        navigationMain.setupWithViewPager(vpMain);
        //滑动事件监听
        vpMain.setOnPageChangeListener(this);
    }

    /**
     * 首次加载 APP 检查更新接口 退出主页面 通知
     */
    @Subscriber(tag = Constant.BUS_APP_UPDATE)
    public void onInspectUpdateApp(final AppUpdate bean) {
        if (bean!=null){
            //获取 本地 版本号
            int versionCode = FileUtils.getLocalVersion(this);
            //获取 本地 版本名称
            String versionName = FileUtils.getLocalVersionName(this);

            //TODO 将实体类保存 到本地
            mACache.put(Constant.CACHE_APP_UPDATE, new Gson().toJson(bean));
            //获取更新内容
            content = StringUtils.isStrIntercept(bean.getRemark(),"。");
            /**
             * 业务逻辑判
             */
            if (bean.getVersionCode()>versionCode){
                //显示 我的小红点
                setMyAddRed(3, -1);
                //TODO 判断 当前是否需要强制更新
                if ((bean.getVersionCode()-versionCode)>5){
                    //开始强制更新
                    setShowForceDialog(bean);
                }
            }
        }
    }

    /**
     * 开启强制更新 弹窗
     * @param bean
     */
    private void setShowForceDialog(final AppUpdate bean){
        final MaterialDialog updateApkMsg = new MaterialDialog.Builder(this)
                .title("版本过低")
                .titleColor(Color.parseColor("#EC5B5B"))
                .content("新版本：v "+bean.getVersion()+"\n       由于您版本过低，为了不影响您正常使用，请您及时更新！本次更新内容如下：\n\n"+content)
                .positiveText("立即更新")
                .positiveColor(Color.parseColor("#EC5B5B"))
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {

                        //开启进度条
                        final MaterialDialog progress = new MaterialDialog.Builder(MainActivity.this)
                                .title("版本升级")
                                .content("正在下载安装包，请稍候...")
                                .progress(false, 100, false)
                                .cancelable(false)
                                .show();

                        //执行开始新下载 最新版本APK
                        InstallUtils.with(MainActivity.this)
                                //必须-下载地址
                                .setApkUrl(bean.getDownLoadUrl())
                                //非必须，默认update
                                .setApkName("update")
                                //非必须-下载回调
                                .setCallBack(new InstallUtils.DownloadCallBack() {
                                    @Override
                                    public void onStart() {
                                        //TODO 设置开始下载进度
                                        progress.setProgress(0);
                                    }

                                    @Override
                                    public void onComplete(String path) {
                                        //销毁弹窗
                                        progress.dismiss();
                                        /**
                                         * 安装APK工具类
                                         * @param context       上下文
                                         * @param filePath      文件路径
                                         * @param callBack      安装界面成功调起的回调
                                         */
                                        InstallUtils.installAPK(MainActivity.this, path, new InstallUtils.InstallCallBack() {
                                            @Override
                                            public void onSuccess() {
                                            }

                                            @Override
                                            public void onFail(Exception e) {
                                                ToastUtils.showShort(MainActivity.this,"安装失败！");
                                            }
                                        });
                                    }

                                    @Override
                                    public void onLoading(long total, long current) {
                                        //下载中
                                        //TODO 配置 正在下载任务栏 参数信息
                                        progress.setProgress((int) (current * 100 / total));
                                        LogUtils.i("downLoadAPK:------------>已下载 "+(current * 100 / total)+" %");
                                    }

                                    @Override
                                    public void onFail(Exception e) {
                                        //销毁弹窗
                                        progress.dismiss();
                                        //下载失败
                                        ToastUtils.showShort(MainActivity.this,"本次下载失败，请重试！");
                                    }

                                    @Override
                                    public void cancel() {
                                        //下载取消
                                    }
                                })
                                //开始下载
                                .startDownload();
                    }
                }).show();
        // 设置点击屏幕Dialog不消失
        updateApkMsg.setCanceledOnTouchOutside(false);
        //取消Back键监听
        updateApkMsg.setCancelable(false);
    }

    /**
     * 获取 省、市、区、 三级联动 返回结果
     */
    @Subscriber(tag = Constant.BUS_APP_GET_LINKAGE)
    public void onLinkageList(List<Linkage> list) {
        mACache.put(Constant.CACHE_LINKAGE, mGson.toJson(list));
    }

    /**
     * 获取所有下拉集合列表 返回结果
     */
    @Subscriber(tag = Constant.BUS_APP_ALL_SELECT)
    public void onAllSelect(List<Spinner> list) {
        //TODO 循环遍历 将下拉集合列表 存到本地
        for (Spinner spinner : list){
            mACache.put(spinner.getOptionalName(), mGson.toJson(spinner.getOptionalFieldOptions()));
        }
    }

    /**
     * viewPager 滑动事件
     * @param position
     * @param positionOffset
     * @param positionOffsetPixels
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }
    @Override
    public void onPageSelected(int position) {
        //将 TabLayout 设置到相应的位置
        navigationMain.setCurrentItem(position);
    }
    @Override
    public void onPageScrollStateChanged(int state) {
    }

    /**
     * 权限申请
     * 1.文件访问权限
     * 2.相机使用权限
     * 3.获取手机内置信息权限
     * 4.定位信息
     */
    private void requestPermissions() {
        RxPermissions rxPermission = new RxPermissions(MainActivity.this);

        rxPermission.requestEach(
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.CAMERA,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_FINE_LOCATION)
                .subscribe(new Consumer<Permission>() {
                    @Override
                    public void accept(Permission permission) throws Exception {
                        if (permission.granted) {
                            // 用户已经同意该权限
                            LogUtils.d(permission.name + " is granted.");
                        } else if (permission.shouldShowRequestPermissionRationale) {
                            // 用户拒绝了该权限，没有选中『不再询问』（Never ask again）,那么下次再次启动时，还会提示请求权限的对话框
                            LogUtils.d(permission.name + " is denied. More info should be provided.");
                        } else {
                            // 用户拒绝了该权限，并且选中『不再询问』
                            LogUtils.d(permission.name + " is denied. More info should be provided.");
                        }
                    }
                });
    }

    /**
     * 接收 退出页面消息
     */
    @Subscriber(tag = Constant.BUS_EXIT_MAIN)
    public void onExitMainUI(String exit) {
        finish();
    }

    /**
     * 屏蔽 back 键
     */
    @Override
    public void onBackPressed() {
//        super.onBackPressed();
    }

    /**
     * 设置 我的小红点
     * @param position 底部控件 第几个
     * @param number   -1：小圆点；> 0：数字
     * @return
     */
    private Badge setMyAddRed(int position, int number) {
        // add badge
        return new QBadgeView(this)
                .setBadgeNumber(number)
                .setGravityOffset(26, 5, true)
                .setBadgeBackgroundColor(Color.RED)
                .setShowShadow(false)
                .bindTarget(navigationMain.getBottomNavigationItemView(position));
    }
}

